import axios from 'axios'
// 引入VueX数据
import store from '@/store'
// 引入Element的Message组件
import { Message } from 'element-ui'
// 引入router
import router from '@/router'
// qs处理请求参数
import qs from 'qs'

const request = axios.create({})

// 封装URL基地址检查函数
function getBaseURL (url) {
  if (url.startsWith('/boss')) {
    return 'http://eduboss.lagou.com'
  } else {
    return 'http://edufront.lagou.com'
  }
}
// 设置请求拦截器
request.interceptors.request.use(function (config) {
  // 根据请求的URL判断基地址，设置给config.baseURL
  config.baseURL = getBaseURL(config.url)
  // 统一设置token信息
  const { user } = store.state
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }
  return config
})

function redirectLogin () {
  router.push({
    name: 'login',
    query: {
      redirect: router.currentRouter.fullPath
    }
  })
}

// 存储正在更新token的状态
let isRefreshing = false
// 存储因为等待token刷新挂起的请求
let requests = []

// 响应拦截器
request.interceptors.response.use(function (response) {
  // 状态码2xx执行
  // console.log('响应成功:', response)
  return response
}, function (error) {
  // 超出 2xx 都会进入这里
  if (error.response) {
    // 请求发送成功，也收到了响应，到状态码超过了2xx（常见错误处理位置）
    // 1. 保存状态码
    const { status } = error.response
    // 2. 判断
    let errorMessage = ''
    if (status === 400) {
      errorMessage = '请求参数错误'
    } else if (status === 401) {
      // 无token信息
      if (!store.state.user) {
        // 跳转登录页
        redirectLogin()
        return Promise.reject(error)
      }
      if (isRefreshing) {
        // 将发送请求保存到函数中，存储到requests中等待执行，并ruturn中止操作
        return requests.push(() => {
          request(error.config)
        })
      }
      isRefreshing = true
      // token无效
      // 根据refresh_token请求新的access_token
      return request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: qs.stringify({
          refreshtoken: store.state.user.refresh_token
        })
      }).then(res => {
        // 如果没有请求到新的access_token,跳转回登录页
        if (res.data.state !== 1) {
          // 清除无效的用户信息
          store.commit('serUser', null)
          // 跳转登录页
          redirectLogin()
          return Promise.reject(error)
        }
        // 成功，将新的access_token更新到本地存储中
        store.commit('setUser', res.data.content)
        // return request(error.config)
        // 根据requests发送所有数据请求
        requests.forEach(callback => callback())
        // 发送完毕清除requests内容
        requests = []
        return request(error.config)
      }).catch(err => {
        console.log(err)
      }).finally(() => {
        isRefreshing = false
      })
    } else if (status === 403) {
      errorMessage = '没有权限，请联系管理员'
    } else if (status === 404) {
      errorMessage = '请求资源不存在'
    } else if (status >= 500) {
      errorMessage = '服务端错误，请联系管理员'
    }
    Message.error(errorMessage)
  } else if (error.request) {
    // 请求发送成功，但没有收到响应
    Message.error('请求超时，请重试')
  } else {
    // 在设置请求时发生了一些失去，触发了错误（未知型错误）
    Message.error(`请求失败${error.message}`)
  }
  // 将请i失败的错误对象继续抛出，传递给接收响应的处理函数
  return Promise.reject(error)
})

export default request
